// 这会主要讨论函数形参中的引用参数,还有加入const的形式参数创建一个临时变量的特殊情况

#include <iostream>

double refcube(const double &rd);

struct free_throws & accumulate (free_throws & target,const free_throws & source);

struct free_throws
{
    std::string name;
    int made;
    int attempted;
    float precent;
};


int main()
{
    double side = 3.0; // 这里如果没有初始化,将会出现Segmentation fault,表示访问了超过限制的内存
    double *pd_side = &side;
    double &rd_side = side;

    long edge = 5l;
    double lens[4] = {2.0, 3.2, 12., 23};

    double c1 = refcube(side);     // rd = side
    double c2 = refcube(lens[2]);  // rd = lens[2]
    double c3 = refcube(rd_side);  // rd = rd_side = side
    double c4 = refcube(*pd_side); // rd = *pd_side = side
    double c5 = refcube(edge);     // rd是一个临时变量,因为long不是一个符合条件的(double类型),C++在进行自动类型提升的时候会产生一个临时变量,然后ra就会成为这个临时变量的引用
    double c6 = refcube(7.0);      // rd是一个临时变量,因为7.0和下面的(side+7.0)都没有名字,这回导致C++产生一个临时变量.....
    double c7 = refcube(side + 7.0);
    // 产生的临时变量只会在函数的调用期间存在(符合自动变量存储期),之后编译器可以随意的将他们删除

    return 0;
}

double refcube(const double &rd)
{
    return rd * rd * rd;
}

free_throws & accumulate (free_throws & target,const free_throws & source){
    target.attempted += source.attempted;
    target.made += source.made;

    return target;
}
// main:
// accumulate() = rd_side;

// 像上面的函数一样,如果返回一个const值,类似于下面的函数
const free_throws & accumulate_s (free_throws & target, const free_throws & source){

}

// 左值和右值

